區塊鏈的動作可以想像是提交一個事物
呼叫區塊鏈事件,呼叫這個時就和呼叫 Rpc 的 eth_call 是一樣的。
其實每個 function 封裝都配合 ETH RPC 的 請求,所以如果你有架設自己的節點服務,也會以喔。
下面的範例是呼叫 USDT 的 balanceOf (通常這個功能是要知道目前地址的 USDT 餘額有多少)
查詢:0xa6a688F107851131F0E1dce493EbBebFAf99203e 的餘額
import { createPublicClient, http } from 'viem';
import { encodeFunctionData } from 'viem';
import { mainnet } from 'viem/chains';
const publicClient = createPublicClient({
chain: mainnet,
transport: http(),
});
//https://abi.hashex.org/
const eFD = await encodeFunctionData({
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
abi: [
{
constant: true,
inputs: [{ name: 'who', type: 'address' }],
name: 'balanceOf',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
],
functionName: 'balanceOf',
args: ['0xa6a688F107851131F0E1dce493EbBebFAf99203e'],
}); // 編譯 bycode,這裡要看一下前端和合約溝通都要使用 abi(很重要),就像介面一樣
console.log(eFD); // 0x70a08231000000000000000000000000a6a688f107851131f0e1dce493ebbebfaf99203e
const data = await publicClient.call({
data: eFD,
to: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
});
// 傳送訊息
console.log('data', data);`
// https://www.rapidtables.com/convert/number/hex-to-decimal.html 轉型
初學者因該看得頭昏眼花,小弟在一開始學時也搞不清楚,但是 solidity 是執行在 EVM 上的,而它執行 是使用 Bytecode 形式,所以在執行時都要轉換成 Bytecode 才可以,當然我們是使用call
才會需要做這樣的轉換,如果大家想更清楚可以看一下這個 eth_call 其實一切都是 Ethereum Client提供的 JSON-RPC API 。
大家可以用著個網站感受一下 https://abi.hashex.org/ 操作一下就會比較好理解
千辛萬苦看懂了,執行一下發現…0x0000000000000000000000000000000000000000000000000000000177ba4393
這是什麼….
當然永遠不會讓我們失望又要轉碼了,還好現在工具都很多下面提供工具網址
https://www.rapidtables.com/convert/number/hex-to-decimal.html
好不容易啊,終於全部搞懂。
接下來我們說一下幾個重要的屬性
從哪邊地址來(取代from)
呼叫智能合約的 function 以及 參數
傳到哪個地址 or 合約
如果你的 Call 有做到交易或是寫入智能合約那這幾個屬性一定要使用喔
交易執行提供的Gas
Gas費用 (基本單位 wei) https://eth-converter.com/ 單位轉換的網址
最大Gas費用
最大Gas優先費用
傳送金額 (ex:eth)
個人覺得交易時最要注意的就是單位 如果沒注意其實會容易錯… 沒關係Viem 也有提供好用的轉型工具可以使用(後面會說到)
不過鐵人賽也是第一次參加規則不是清楚,好像失敗了...,但我還會持續更新的
程式實作:
https://github.com/0xRory/ITHepleViem/blob/main/examples/3_7_Transaction.js
參考:
https://viem.sh/docs/actions/public/call.html